// AbortSignal.timeout() 是一个较新的 API（属于 现代浏览器和 Node.js 的特性），它确实可以更简洁地实现请求超时控制。
// 但在实际开发中，可能不会直接使用它，主要有以下几个原因：

// 1. 兼容性问题
//     AbortSignal.timeout() 是 较新的 API，部分旧浏览器或 Node.js 版本可能不支持：

//     浏览器支持：Chrome >= 93, Firefox >= 98, Safari >= 15.4（2023 年之前的部分浏览器不支持）

//     Node.js：>= 16.17.0（LTS 版本才稳定支持）

//     如果项目需要兼容旧环境，就不能直接使用 AbortSignal.timeout()，而需要回退到 setTimeout + AbortController 的方式。

// 2. 手动控制超时逻辑
//     AbortSignal.timeout() 是自动触发的，无法在请求成功后手动清除超时。例如：
    const controller = new AbortController();
    const signal = AbortSignal.timeout(3000); // 3秒后自动终止

    fetch("https://api.example.com", { signal })
        .then(response => {
            // 如果请求在 3 秒内完成，仍然会继续执行
            console.log("Success!");
        })
        .catch(err => {
            if (err.name === "AbortError") {
                console.log("Request timeout!");
            }
        });

    // 如果请求 在超时前完成，AbortSignal.timeout() 仍然会在 3 秒后触发 AbortError（即使请求已经成功）。
    // 无法像 setTimeout 那样用 clearTimeout 手动取消计时器。

    // 3. 更灵活的超时控制
    //     setTimeout + AbortController 可以更灵活地控制超时逻辑，例如：
    //     动态调整超时时间（比如根据网络状况延长或缩短）
    //     在请求成功后手动清除超时（避免不必要的 AbortError）
    //     结合多个信号（如 AbortSignal.any() 或自定义逻辑）
    const controller = new AbortController();
    const timeoutId = setTimeout(() => controller.abort(), 3000);

    fetch("https://api.example.com", { signal: controller.signal })
        .then(response => {
            clearTimeout(timeoutId); // 手动清除超时
            console.log("Success!");
        })
        .catch(err => {
            if (err.name === "AbortError") {
                console.log("Request timeout!");
            }
        });